package ar.edu.utn.frba.tadp.tp.grupo4.fotomultas_ui;

import javax.lang.model.type.NullType;

import org.uqbar.commons.model.ObservableObject;
import org.apache.commons.lang.ObjectUtils.Null;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.joda.time.DateTime;
import org.uqbar.commons.utils.ApplicationContext;
import org.uqbar.commons.utils.Home;

import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Captura;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Image;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.TipoInfraccion;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Zona;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.exceptions.PatenteNoReconocidaException;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorCapturas;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.ReconocedorDePatentesMock;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.vehiculos.Vehiculo;

public class CreacionCaptura extends ObservableObject{

	public static final String TIPOINFRACCION = "tipoInfraccion";
	public static final String ZONA = "zona";
	public static final String CAPTURA = "captura";
	public static final String IMAGE = "image";
	public static final String FECHA = "fecha";
	
	private Vehiculo vehiculo;
	private TipoInfraccion tipoInfraccion;
	private Zona zona;
	private Image image;
	private DateTime fecha;
	private final Home<Captura> capturasHome;
	private AdministradorCapturas administradorCapturas;
	private Home<Vehiculo> vehiculosHome;
	private ReconocedorDePatentesMock reconocedorPatentes;

	public CreacionCaptura(Home<Captura> visor) {
		this.capturasHome = visor;
	}

	// ********************************************************
	// ** Actions
	// ********************************************************

	public void crearCaptura() {
		MessageBox msg = new MessageBox(new Shell());		
		administradorCapturas = ApplicationContext.getInstance().getSingleton(AdministradorCapturas.class);
		reconocedorPatentes = ApplicationContext.getInstance().getSingleton(ReconocedorDePatentesMock.class);
		vehiculosHome = ApplicationContext.getInstance().getSingleton(Vehiculo.class);			
		
		try {
			Captura captura = new Captura();
			captura.setImage(this.image);
			captura.setZona(this.zona);
			captura.setInfraccion(this.tipoInfraccion);
			captura.setFecha(new DateTime());
			String patente = administradorCapturas.reconocerPatente(captura, reconocedorPatentes);
			this.vehiculo = new Vehiculo(patente);
			this.vehiculosHome.add(this.vehiculo);
			this.vehiculo.addCaptura(captura);
			msg.setMessage("Se asigno correctamente la captura al vehiculo: " + this.vehiculo.getPatente());
			msg.open();
		} 
		catch (PatenteNoReconocidaException ex) {			
			msg.setMessage(ex.getMessage());
			msg.open();
		}
		catch (NullPointerException nex){
			msg.setMessage(nex.getMessage());
			msg.open();
		}
	}
	
	// ********************************************************
	// ** Accessors
	// ********************************************************

	public TipoInfraccion getTipoInfraccion() {
		return this.tipoInfraccion;
	}

	public void setTipoInfraccion(TipoInfraccion tipoInfraccion) {
		this.setFieldValue(TIPOINFRACCION, tipoInfraccion);
	}

	public Zona getZona() {
		return this.zona;
	}

	public void setZona(Zona zona) {
		this.setFieldValue(ZONA, zona);
	}
	
	public Image getImage(){
		return this.image;
	}
	
	public void setImage(Image image){
		this.setFieldValue(IMAGE, image);
	}
	
	public DateTime getFechaCaptura(){
		return this.fecha;
	}
	
	public void setFechaCaptura(DateTime fecha){
		this.setFieldValue(FECHA, fecha);
	}
}
